<script setup>
	import { computed, ref } from 'vue';
	import { onLoad } from '@dcloudio/uni-app'
	import { getGoodsByIdAPI, postMemberCartAPI } from '@/utils/apis.js'
	import AddressPanel from './components/AddressPanel.vue'
	import ServicePanel from './components/ServicePanel.vue'
	
	// 获取屏幕边界到安全区域距离
	const { safeAreaInsets } = uni.getSystemInfoSync()
	
	// 获取页面参数
	let query = defineProps({
		id: {
			type: String
		}
	})
	
	let goods = ref({})
	let propertiesArr = ref([])
	let picturesArr = ref([])
	let bannerArr = ref([])
	// 商品详情接口获取
	let getGoodsByIdData = async() => {
		let res = await getGoodsByIdAPI(query.id)
		goods.value = res.result
		// 详情文本
		propertiesArr.value = res.result.details.properties
		// 详情图片
		picturesArr.value = res.result.details.pictures
		// 轮播图
		bannerArr.value = res.result.mainPictures
		
		// SKU组件所需格式
		localdata.value = {
			_id: res.result.id,
			name: res.result.id,
			goods_thumb: res.result.mainPictures[0],
			spec_list: res.result.specs.map(v => {
				return {
					name: v.name,
					list: v.values
				}
			}),
			sku_list: res.result.skus.map(v => {
				return {
					_id: v.id, // sku id
					goods_id: res.result.id, // 商品 id
					goods_name: res.result.name,
					image: v.picture,
					price: v.price * 100, // 注意：需要乘以 100
					stock: v.inventory,
					sku_name_arr: v.specs.map(vv => vv.valueName)
				}
			})
		}
	}
	onLoad(() => {
		getGoodsByIdData()
	})
	
	// 点击图片时
	const currentIndex = ref(0)
	let onChange = (ev) => {
		currentIndex.value = ev.detail.current
	}
	
	const onTapImage = (url) => {
		// 大图预览
		uni.previewImage({
			current: url,
			urls: bannerArr.value
		})
	}
	
	// 弹出层
	let popup = ref()
	let popupName = ref('')
	let openPopup = (name) => {
		popupName.value = name
		popup.value.open()
	}
	
	// 详情SKU
	// 数据来源
	let localdata = ref()
	// 是否显示
	let isShowSku = ref(false)
	// 按钮模式 1:都显示 2:只显示购物车 3:只显示立即购买
	let mode = ref(1)
	// 打开sku弹窗的函数
	let openSkuPopup = (val) => {
		isShowSku.value = true
		mode.value = val
	}
	// 组件实例
	let skuPopupRef = ref()
	// 每次点击都要把 组件的内容 显示到 外面页面上
	// join 把数组变成 字符串  以空格显示
	// trim 取消选择时，还是一个数组，只是为空，所以要想显示后面的文字，需要去除空格
	let selectArrText = computed(() => {
		return skuPopupRef.value?.selectArr.join(' ').trim() || '请选择商品规格'
	})
	// 点击加入购物车
	let onAddCart = async (val) => {
		let data = {
			skuId: val._id,
			count: val.buy_num
		}
		await postMemberCartAPI(data)
		uni.$showMsg('添加成功')
		isShowSku.value = false
	}
	
	// 点击立即购买
	let onBuyNow = (val) => {
		uni.navigateTo({
			url: `/subpkg/create/create?skuId=${val._id}&count=${val.buy_num}`
		})
	}
	
	
</script>

<template>
	<scroll-view scroll-y class="viewport">
		<!-- 基本信息 -->
		<view class="goods">
			<!-- 商品主图 -->
			<view class="preview">
				<swiper circular @change="onChange">
					<swiper-item v-for="item in bannerArr" :key="item">
						<image @click="onTapImage(item)" mode="aspectFill" :src="item" />
					</swiper-item>
				</swiper>
				<view class="indicator">
					<text class="current">{{ currentIndex + 1 }}</text>
					<text class="split">/</text>
					<text class="total">{{ bannerArr.length }}</text>
				</view>
			</view>

			<!-- 商品简介 -->
			<view class="meta">
				<view class="price">
					<text class="symbol">¥</text>
					<text class="number">{{goods.price}}</text>
				</view>
				<view class="name ellipsis">{{goods.name}}</view>
				<view class="desc">{{goods.desc}}</view>
			</view>

			<!-- 操作面板 -->
			<view class="action">
				<view class="item arrow" @click="openSkuPopup(1)">
					<text class="label">选择</text>
					<text class="text ellipsis">{{selectArrText}}</text>
				</view>
				<view class="item arrow" @click="openPopup('address')">
					<text class="label">送至</text>
					<text class="text ellipsis"> 请选择收获地址 </text>
				</view>
				<view class="item arrow" @click="openPopup('service')">
					<text class="label">服务</text>
					<text class="text ellipsis"> 无忧退 快速退款 免费包邮 </text>
				</view>
			</view>
		</view>

		<!-- 商品详情 -->
		<view class="detail panel">
			<view class="title">
				<text>详情</text>
			</view>
			<view class="content">
				<view class="properties">
					<!-- 属性详情 -->
					<view
						class="item"
						v-for="item in propertiesArr"
						:key="item.name">
						<text class="label">{{item.name}}</text>
						<text class="value">{{item.value}}</text>
					</view>
				</view>
				<!-- 图片详情 -->
				<image
					mode="widthFix"
					v-for="item in picturesArr"
					:key="item"
					:src="item"></image>
			</view>
		</view>

		<!-- 同类推荐 -->
		<view class="similar panel">
			<view class="title">
				<text>同类推荐</text>
			</view>
			<view class="content">
				<navigator v-for="item in goods.similarProducts" :key="item.id" class="goods" hover-class="none" :url="`/pages/goods/goods?id=${item.id}`">
					<image class="image" mode="aspectFill" :src="item.picture"></image>
					<view class="name ellipsis">{{item.name}}</view>
					<view class="price">
						<text class="symbol">¥</text>
						<text class="number">{{item.price}}</text>
					</view>
				</navigator>
			</view>
		</view>
	</scroll-view>

	<!-- 用户操作 -->
	<view class="toolbar" :style="{ paddingBottom: safeAreaInsets?.bottom + 'px' }">
		<view class="icons">
			<button class="icons-button"><text class="icon-heart"></text>收藏</button>
			<button class="icons-button" open-type="contact">
				<text class="icon-handset"></text>客服
			</button>
			<!-- 跳转到购物车页面后，为了返回，跳到cartTwo页面 -->
			<navigator class="icons-button" url="/pages/cart/cartTwo">
				<text class="icon-cart"></text>购物车
			</navigator>
		</view>
		<view class="buttons">
			<view class="addcart" @click="openSkuPopup(2)"> 加入购物车 </view>
			<view class="buynow" @click="openSkuPopup(3)"> 立即购买 </view>
		</view>
	</view>
	
	
	<!-- 弹出层 -->
	<uni-popup ref="popup" type="bottom" background-color="#fff">
	    <AddressPanel v-if="popupName === 'address'" @close="popup.close()" />
	    <ServicePanel v-if="popupName === 'service'" @close="popup.close()" />
	</uni-popup>
	
	
	<!-- SKU弹窗组件 -->
	<vk-data-goods-sku-popup
		ref="skuPopupRef"
	    v-model="isShowSku"
	    :localdata="localdata"
		:mode="mode"
		add-cart-background-color='#FFA868'
		buy-now-background-color='#27BA9B'
		@add-cart="onAddCart"
		@buy-now="onBuyNow"
	></vk-data-goods-sku-popup>
	
	
	
</template>

<style lang="scss">
	page {
		height: 100%;
		overflow: hidden;
		display: flex;
		flex-direction: column;
	}

	.viewport {
		background-color: #f4f4f4;
		height: 100%;
	}

	.panel {
		margin-top: 20rpx;
		background-color: #fff;

		.title {
			display: flex;
			justify-content: space-between;
			align-items: center;
			height: 90rpx;
			line-height: 1;
			padding: 30rpx 60rpx 30rpx 6rpx;
			position: relative;

			text {
				padding-left: 10rpx;
				font-size: 28rpx;
				color: #333;
				font-weight: 600;
				border-left: 4rpx solid #27ba9b;
			}

			navigator {
				font-size: 24rpx;
				color: #666;
			}
		}
	}

	.arrow {
		&::after {
			position: absolute;
			top: 50%;
			right: 30rpx;
			content: '\e6c2';
			color: #ccc;
			font-family: 'erabbit' !important;
			font-size: 32rpx;
			transform: translateY(-50%);
		}
	}

	/* 商品信息 */
	.goods {
		background-color: #fff;

		.preview {
			height: 750rpx;
			position: relative;

			swiper,swiper-item,image {
				width: 750rpx;
				height: 750rpx;
			}

			.indicator {
				height: 40rpx;
				padding: 0 24rpx;
				line-height: 40rpx;
				border-radius: 30rpx;
				color: #fff;
				font-family: Arial, Helvetica, sans-serif;
				background-color: rgba(0, 0, 0, 0.3);
				position: absolute;
				bottom: 30rpx;
				right: 30rpx;

				.current {
					font-size: 26rpx;
				}

				.split {
					font-size: 24rpx;
					margin: 0 1rpx 0 2rpx;
				}

				.total {
					font-size: 24rpx;
				}
			}
		}

		.meta {
			position: relative;
			border-bottom: 1rpx solid #eaeaea;

			.price {
				height: 130rpx;
				padding: 25rpx 30rpx 0;
				color: #fff;
				font-size: 34rpx;
				box-sizing: border-box;
				background-color: #35c8a9;
			}

			.number {
				font-size: 56rpx;
			}

			.brand {
				width: 160rpx;
				height: 80rpx;
				overflow: hidden;
				position: absolute;
				top: 26rpx;
				right: 30rpx;
			}

			.name {
				max-height: 88rpx;
				line-height: 1.4;
				margin: 20rpx;
				font-size: 32rpx;
				color: #333;
			}

			.desc {
				line-height: 1;
				padding: 0 20rpx 30rpx;
				font-size: 24rpx;
				color: #cf4444;
			}
		}

		.action {
			padding-left: 20rpx;

			.item {
				height: 90rpx;
				padding-right: 60rpx;
				border-bottom: 1rpx solid #eaeaea;
				font-size: 26rpx;
				color: #333;
				position: relative;
				display: flex;
				align-items: center;

				&:last-child {
					border-bottom: 0 none;
				}
			}

			.label {
				width: 60rpx;
				color: #898b94;
				margin: 0 16rpx 0 10rpx;
			}

			.text {
				flex: 1;
				-webkit-line-clamp: 1;
			}
		}
	}

	/* 商品详情 */
	.detail {
		padding-left: 20rpx;

		.content {
			margin-left: -20rpx;

			image {
				width: 100%;
				vertical-align: bottom;
			}
		}

		.properties {
			padding: 0 20rpx;
			margin-bottom: 30rpx;

			.item {
				display: flex;
				line-height: 2;
				padding: 10rpx;
				font-size: 26rpx;
				color: #333;
				border-bottom: 1rpx dashed #ccc;
			}

			.label {
				width: 200rpx;
			}

			.value {
				flex: 1;
			}
		}
	}

	/* 同类推荐 */
	.similar {
		.content {
			padding: 0 20rpx 200rpx;
			background-color: #f4f4f4;
			display: flex;
			flex-wrap: wrap;

			.goods {
				width: 340rpx;
				padding: 24rpx 20rpx 20rpx;
				margin: 20rpx 7rpx;
				border-radius: 10rpx;
				background-color: #fff;
				box-sizing: border-box;
			}

			.image {
				width: 300rpx;
				height: 260rpx;
			}

			.name {
				height: 80rpx;
				margin: 10rpx 0;
				font-size: 26rpx;
				color: #262626;
			}

			.price {
				line-height: 1;
				font-size: 20rpx;
				color: #cf4444;
			}

			.number {
				font-size: 26rpx;
				margin-left: 2rpx;
			}
		}

		navigator {
			&:nth-child(even) {
				margin-right: 0;
			}
		}
	}

	/* 底部工具栏 */
	.toolbar {
		position: fixed;
		left: 0;
		right: 0;
		bottom: 0;
		z-index: 1;
		background-color: #fff;
		height: 100rpx;
		padding: 0 20rpx var(--window-bottom);
		border-top: 1rpx solid #eaeaea;
		display: flex;
		justify-content: space-between;
		align-items: center;
		box-sizing: content-box;

		.buttons {
			display: flex;

			&>view {
				width: 220rpx;
				text-align: center;
				line-height: 72rpx;
				font-size: 26rpx;
				color: #fff;
				border-radius: 72rpx;
			}

			.addcart {
				background-color: #ffa868;
			}

			.buynow,
			.payment {
				background-color: #27ba9b;
				margin-left: 20rpx;
			}
		}

		.icons {
			padding-right: 10rpx;
			display: flex;
			align-items: center;
			flex: 1;

			.icons-button {
				flex: 1;
				text-align: center;
				line-height: 1.4;
				padding: 0;
				margin: 0;
				border-radius: 0;
				font-size: 20rpx;
				color: #333;
				background-color: #fff;

				&::after {
					border: none;
				}
			}

			text {
				display: block;
				font-size: 34rpx;
			}
		}
	}
</style>